请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
数据范围: , 数组中任意值满足
进阶:时间复杂度 ,空间复杂度
[-1,0,3,4,6,10,13,14],13
6
13 出现在nums中并且下标为 6
[],3
-1
nums为空,返回-1
[-1,0,3,4,6,10,13,14],2
-1
2 不存在nums中因此返回 -1
数组元素长度在[0,10000]之间数组每个元素都在 [-9999, 9999]之间。
# 递归的写法 class Solution: def find(self, nums, ind1, ind2, target): ind = (ind1 + ind2) // 2 # 终止条件 if nums[ind] == target: return ind if ind in [ind1, ind2]: # 此时说明不存在 return -1 # 查找数据在右边 if target > nums[ind]: return self.find (nums, ind, ind2, target) # 查找数据在左边 if target < nums[ind]: return self.find (nums, ind1, ind, target) def search(self , nums: List[int], target: int) -> int: # 二分查找 if nums == []: return -1 return self.find(nums, 0, len(nums), target)
class Solution: def search(self , nums: List[int], target: int) -> int: left , right = 0 , len(nums) while left < right : mid = (left + right) // 2 if nums[mid] > target: right = mid elif nums[mid] < target: left = mid + 1 else: return mid return -1
class Solution: def search(self , nums: List[int], target: int) -> int: # write code here left = 0 #设置左指针 right = len(nums) - 1 #设置右指针 while left <= right: #候选区有值的情况 mid = (left+right)//2 if target == nums[mid]: return mid elif target > nums[mid]: left = mid + 1 #目标值大于中间值,左指针移动至中间值后一位 else: right = mid - 1 #目标值小于中间值,左指针移动至中间值前一位 else: return -1 #没有目标值的情况
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param nums int整型一维数组 # @param target int整型 # @return int整型 # class Solution: def search(self , nums: List[int], target: int) -> int: # write code here l=0.0 r=len(nums)-1 while l<=r: mid=int(0.5*(l+r)) #print(mid) if nums[mid]==target: return mid if nums[mid]<=target: l=mid+1 else: r=mid-1 return -1
class Solution: def search(self , nums: List[int], target: int) -> int: # write code here if not nums: return -1 if len(nums)==1 and nums[0]==target: return 0 i,j =0,len(nums)-1 while i<j : if nums[i] < target: i += 1 elif nums[j] > target: j -= 1 if nums[i] == target: return i elif nums[j] == target: return j return -1
class Solution: def search(self , nums: List[int], target: int) -> int: if len(nums) < 1: return -1 left = 0 right = len(nums) - 1 while left <= right: mid = int((left+right) / 2) if nums[mid] == target: return mid elif nums[mid] > target: right = mid - 1 else: left = mid + 1 return -1
class Solution: def search(self , nums: List[int], target: int) -> int: left = 0 right = len(nums)-1 while left <= right: middle = (left+right) // 2 if nums[middle] == target: return middle if nums[middle] < target: left = middle + 1 else: right = right - 1 return -1
class Solution: # 非递归版 # 时间复杂度:O(logn) 空间复杂度:O(1) def search(self , nums: List[int], target: int) -> int: first = 0 last = len(nums) - 1 while first <= last: mid = (first + last) // 2 if nums[mid] == target: return mid elif nums[mid] > target: last = mid - 1 else: first = mid + 1 return -1
class Solution: def search(self , nums: List[int], target: int) -> int: if len(nums) == 0: return -1 left, right = 0, len(nums) while left <= right: mid = (left + right) // 2 if nums[mid] < target: left = mid + 1 elif nums[mid] > target: right = mid - 1 else: return mid return -1
class Solution: def search(self , nums: List[int], target: int) -> int: # write code here low = 0 high = len(nums)-1 while low<=high: mid = (high-low)//2+low num = nums[mid] if num == target: return mid elif num>target: high = mid -1 else: low = mid+1 return -1
class Solution: def search(self , nums: List[int], target: int) -> int: if len(nums)==0: return -1 return self.find(nums,target) def find(self,arr,target): low,high=0,len(arr) while low<=high: mid=low+(high-low)//2 if arr[mid]<target: low=mid+1 elif arr[mid]>target: high=mid-1 else: return mid return -1